#pragma once
// #include "tcpserver.hpp"
#include "httpprotcol.hpp"
#include "Socket.hpp"
#include "EpollServer.hpp"

// #include "Usermanage.hpp"

// using namespace UserManagerModule;
// using namespace TcpServerModule;
using namespace SocketModule;

// UserManager um;

namespace HttpSeverModule
{
    using http_handler_t = std::function<void(HttpRequest &, HttpResponse &)>;
    using handler_t = std::function<void(int, int)>;
    class HttpSever
    {
    public:
        HttpSever(int port)
            //: _tsvr(std::make_unique<TcpServer>(port))
            : _epollserver(port)
        {
            _epollserver.Register([this](int _epfd, int fd)
                                  { this->HandlerHttpRequest(_epfd, fd); });
            std::cout<<"epoll register success!"<<std::endl;
        }
        void Register(std::string funcname, http_handler_t func)
        {
            _route[funcname] = func;
        }
        bool SafeCheck(const std::string &service) // 检查服务是否存在
        {
            auto iter = _route.find(service);
            return iter != _route.end();
        }
        void Start()
        {
            // _tsvr->InitServer([this](SockPtr sockp, InetAddr client)
            //                   { this->HandlerHttpRequest(sockp, client); });
            // _tsvr->Start();
            _epollserver.Init();
            _epollserver.loop();
        }
        bool HandlerHttpRequest(int _epfd, int fd)
        {
            // um.AddUser(sockp->Fd(),client);
            std::string req_str;

            char buffer[4096] = {0};
            int n = recv(fd, buffer, sizeof(buffer) - 1, 0); // 因为文件描述符就绪，所以不会阻塞
            req_str = buffer;
            if (n > 0)
            {
                LOG(DEBUG) << "收到信息：" << req_str;
                HttpRequest hrq;
                hrq.Deserialize(req_str);
                HttpResponse hrp;
                if (hrq.HasArgs())
                {
                    std::string service = hrq.Path();
                    if (SafeCheck(service))
                        _route[service](hrq, hrp); // 功能调用
                    else
                        hrp.Build(hrq); // debug
                }
                else
                {
                    hrp.Build(hrq);
                }

                std::string resp_str;
                hrp.Serialize(resp_str);
                send(fd, resp_str.c_str(), resp_str.size(), 0);
                // um.Router(resp_str);
                return true;
            }
            else if (n == 0)
            {
                std::cout << "client quit,sockfd:" << fd << std::endl;
                int n = epoll_ctl(_epfd, EPOLL_CTL_DEL, fd, nullptr); // 先删后关
                if (n < 0)
                {
                    LOG(ERROR) << "epoll_ctl error";
                    return false;
                }
                LOG(DEBUG) << "epoll success";
                close(fd);
            }
            else
            {
                std::cout << "recv error,disconnect:" << fd << std::endl;
                close(fd);
                int n = epoll_ctl(_epfd, EPOLL_CTL_DEL, fd, nullptr); // 先删后关
                if (n < 0)
                {
                    LOG(ERROR) << "epoll_ctl error";
                    return false;
                }
                LOG(DEBUG) << "epoll success";
                close(fd);
            }
            return true;
        }
        // bool HandlerHttpRequest(SockPtr sockp, InetAddr client)
        // {
        //     //um.AddUser(sockp->Fd(),client);
        //     std::string req_str;
        //     while (true)
        //     {
        //         int n = sockp->Recv(req_str);
        //         if (n > 0)
        //         {
        //             LOG(DEBUG)<<"收到信息："<<req_str;
        //             HttpRequest hrq;
        //             hrq.Deserialize(req_str);
        //             HttpResponse hrp;
        //             if (hrq.HasArgs())
        //             {
        //                 std::string service = hrq.Path();
        //                 if (SafeCheck(service))
        //                     _route[service](hrq, hrp); // 功能调用
        //                 else
        //                     hrp.Build(hrq); // debug
        //             }
        //             else
        //             {
        //                 hrp.Build(hrq);
        //             }

        //             std::string resp_str;
        //             hrp.Serialize(resp_str);
        //             sockp->Send(resp_str);
        //             //um.Router(resp_str);
        //             return true;
        //         }
        //         else if (n == 0)
        //         {
        //             LOG(INFO) << "client quit,client: " << client.Ip();
        //             //um.DelUser(client);
        //             break;
        //         }
        //         else
        //         {
        //             LOG(ERROR) << "recv fail";
        //             return false;
        //         }
        //     }
        //     return true;
        // }

    private:
        // std::unique_ptr<TcpServer> _tsvr;
        EpollServer _epollserver;
        std::unordered_map<std::string, http_handler_t> _route; // 功能路由
    };
}